package jmine.tec.services.api.factory;

import jmine.tec.services.annotations.ServiceImplementor;
import jmine.tec.services.api.Service;
import jmine.tec.utils.reflection.AnnotationUtils;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import bancosys.tec.utils.factory.ClassListFactoryBean;

/**
 * Constroi uma lista de classes de serviços tanto da API anterior (hierarquia) quanto da nova API (anotações).
 * 
 * @author jrenaut
 */
public class ServiceClassListFactoryBean extends ClassListFactoryBean {

    private Log log = LogFactory.getLog(ServiceClassListFactoryBean.class);

    /**
     * Aceita esta classe se for uma especialização de Service ou se estiver anotada com ServiceImplementor.
     * 
     * @param clazz A classe
     * @return true caso seja extensão de Service ou anotada com ServiceImplementor
     */
    @Override
    protected final boolean doAccept(Class<?> clazz) {
        // procura pela anotação
        if (AnnotationUtils.findClassWithAnnotation(clazz, ServiceImplementor.class) != null) {
            return true;
        }

        // se não encontrar verifica a hierarquia
        if (Service.class.isAssignableFrom(clazz)) {
            return true;
        }

        this.log.warn(clazz.getName() + " is not a Service by neither of the known API's");
        return false;
    }
}
